#ifndef KPEXTOPIMGRWINF32C1_H
#define KPEXTOPIMGRWINF32C1_H

#include "kpextVkContext.h"
#include "kpextBaseCompute.h"

namespace kpext {

/**
 * @brief 单通道32位浮点图像每行开窗操作
 */
class OpImgRWinF32C1 : public BaseCompute{
public:
    explicit OpImgRWinF32C1(kpextVkContext * ctx);

    virtual ~OpImgRWinF32C1() override;

    /**
     * @brief  重新构建计算管线及相关资源
     * @param cols  输入二维图像的列数
     * @param rows  输入二维图像的行数
     * @param inbuf  输入缓冲
     * @param outbuf 输出缓冲
     * @param cmdbuf 用于内部数据初始化操作的命令缓冲
     * @param winType 开窗的类型， 0为矩形窗， 1为汉宁窗(hanning/hann)
     * @param winLen  开窗的窗口波形长度，为~0U是与输入列数等长
     */
    virtual void rebuild(int cols, int rows,
                         std::shared_ptr<BaseBuffer> inbuf,
                         std::shared_ptr<BaseBuffer> outbuf,
                         std::shared_ptr<CommandBuffer> cmdbuf,
                         uint32_t winType = 1,
                         uint32_t winLen = ~0U
                         );

    /**
     * @brief 向目标内存填充开窗波形数据
     * @param dst 目标内存
     * @param elemLen  开窗波形的元素长度
     * @param winType 开窗的类型， 0为矩形窗， 1为汉宁窗(hanning/hann)
     * @param winLen  开窗的窗波形长度。 如果为大于elemLen， 自动会缩减为elemLen
     */
    void fillWinWave(float *dst, size_t elemLen,
                     uint32_t winType = 1,
                     uint32_t winLen = ~0U
                     );

protected:

    /**
     * @brief 计算着色器的work group size
     */
    std::array<uint32_t, 3> m_workGroupSize;

    /**
     * @brief 开窗的类型， 0为矩形窗， 1为汉宁窗(hanning/hann)
     */
    uint32_t m_winType;

    /**
     * @brief 开窗的窗波形长度
     */
    uint32_t m_winLen;

    /**
     * @brief 用于存放窗口波形数据的统一纹素缓冲
     */
    std::shared_ptr<UniformTexelBuffer> m_uniformBuf;

private:
    using BaseCompute::rebuild;

}; //class kpext::OpImgRWinF32C1


} // namespace kpext

#endif // KPEXTOPIMGRWINF32C1_H
